#include "ToolBox/Matrix.h"

Matrix4f::Matrix4f()
{
    tab = new float[16];

    for(int i=0;i<16;i++)
    {
        tab[i]=0.0;
    }
}

Matrix4f::Matrix4f(float *aValues)
{
    tab= new float[16];
    SetMatrix(aValues);
}

Matrix4f::Matrix4f(const Matrix4f & aCopie)
{
    tab = new float[16];

    for(int i=0;i<16;i++)
    {
        tab[i]=aCopie.tab[i];
    }
}

void Matrix4f::SetMatrix(float * aValues)
{
    for(int i=0;i<4;i++)
    {
        for(int j=0; j<4 ; j++)
        {
            tab[i*4+j]=aValues[i*4+j];
        }
    }
}

Matrix4f Matrix4f::operator*(const Matrix4f & aMatrix)
{
    Matrix4f resultat;

    for(int j=0;j<4;j++)
    {
        for(int i=0;i<4;i++)
        {
             resultat.tab[j*4 +i]=  (tab[j*4+0]*aMatrix.tab[0+i])+
                                    (tab[j*4+1]*aMatrix.tab[4+i])+
                                    (tab[j*4+2]*aMatrix.tab[8+i])+
                                    (tab[j*4+3]*aMatrix.tab[12+i]);
        }
    }
    return resultat;
}

void Matrix4f::operator =(const Matrix4f & aMatrix)
{
    for(int i=0;i<16;i++)
    {
        tab[i]=aMatrix.tab[i];
    }
}

Vectorf Matrix4f::operator*(const Vectorf & aVector)
{
    Vectorf resultat(0.0,0.0,0.0,0.0);

    for(int j=0;j<4;j++)
    {

     resultat.coordinates[j]=   (tab[j*4+0]*aVector.coordinates[0])+
                                (tab[j*4+1]*aVector.coordinates[1])+
                                (tab[j*4+2]*aVector.coordinates[2])+
                                (tab[j*4+3]*aVector.coordinates[3]);
    }
    return resultat;
}

void Matrix4f::Print()
{
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            printf("| %f |",tab[i*4+j]);
        }
        printf(" \n");
    }
    printf(" \n");
}

void Matrix4f::FillMatrixTranslation(Vectorf trans)
{
    tab[0]=1;   tab[1]=0;   tab[2]=0;   tab[3]=trans.x();
    tab[4]=0;   tab[5]=1;   tab[6]=0;   tab[7]=trans.y();
    tab[8]=0;   tab[9]=0;   tab[10]=1;  tab[11]=trans.z();
    tab[12]=0;  tab[13]=0;  tab[14]=0;  tab[15]=1;
}

void Matrix4f::FillMatrixRotationX(float angle)
{
    tab[0]=1;           tab[1]=0;           tab[2]=0;           tab[3]=0;
    tab[4]=0;           tab[5]=cos(angle);  tab[6]=-sin(angle); tab[7]=0;
    tab[8]=0;           tab[9]=sin(angle);  tab[10]=cos(angle); tab[11]=0;
    tab[12]=0;          tab[13]=0;          tab[14]=0;          tab[15]=1;
}

void Matrix4f::FillMatrixRotationY(float angle)
{
    tab[0]=cos(angle);  tab[1]=0.0;         tab[2]=-sin(angle); tab[3]=0;
    tab[4]=0.0;         tab[5]=1.0;         tab[6]=0.0;         tab[7]=0;
    tab[8]=sin(angle);  tab[9]=0;           tab[10]=cos(angle); tab[11]=0;
    tab[12]=0;          tab[13]=0;          tab[14]=0;          tab[15]=1;
}

void Matrix4f::FillMatrixRotationZ(float angle)
{
    tab[0]=cos(angle);  tab[1]=sin(angle);  tab[2]=0.0;         tab[3]=0;
    tab[4]=-sin(angle); tab[5]=cos(angle);  tab[6]=0.0;         tab[7]=0;
    tab[8]=0.0;         tab[9]=0;           tab[10]=1.0;        tab[11]=0;
    tab[12]=0;          tab[13]=0;          tab[14]=0;          tab[15]=1;
}







